M
MATTHEW REUBEN MARGOLIS
I have a form that contains both text fields and a file field for
uploading. The form is set to post to a ruby script on my server. The
script works(excluding file uploading) when I delete
ENCTYPE="multipart/form-data" from the form tag but if that is
present(and it needs to be for the image upload to work) then ruby cgi
chokes on a gsub for one of my text field parameters called comment.
imageadmin.rb:14: private method `gsub!' called for
#<StringIO:0x20221278> (NoMethodError)
Anyone have some ideas for how I can make this work?
Here is the form code (it is from an eruby file)
-----------------------------------------------------
% imageArray = Dir.glob("*.jpg").sort!
% commentArray = imageArray.collect {|image| image[4..-5]}
% commentArray.collect {|image| image.gsub!("_", " ")}
<FORM ENCTYPE="multipart/form-data" action="imageadmin.rb" method="post">
<%imageArray.length.times do |count|%>
<img src="<%=imageArray[count]%>">
<BR />
Comment:<input type="text" name="comment"
value="<%=commentArray[count]%>">
<BR />
Number:<input type="text" name="order"
value="<%=imageArray[count][0..2] %>">
<BR />
Delete:<input type="checkbox" name="delete"
value="<%=imageArray[count]%>">
<BR />
<%end%>
<BR />
<BR />
<input type="file" value="upload">
Comment:<input type="text" name="uploadcomment" value="">
<BR />
<input type="submit" value="Submit">
</FORM>
-----------------------------------------------------------------
And here is the script itself. I apologize for the lack of comments and
that it isn't as short as it could be. I am going to clean it up tonight.
-----------------------------------------------------------------------
#!/usr/bin/env ruby
$stderr = File.open("error.log", "w+")
print "Content-type: text/html\n\n"
require 'cgi'
cgi = CGI.new
deleteArray = cgi.params['delete']
imageArray = Dir.glob("*.jpg").sort!
oldArray = Dir.glob("*.jpg").sort!
commentArray = cgi.params['comment']
#####Here is where I get the error#####
commentArray.each {|com| com.gsub!(" ", "_")}
numberArray = cgi.params['order']
count = imageArray.length
count.times do |x|
imageArray[x].sub!(/^\d\d\d/, numberArray[x])
end
count.times do |x|
imageArray[x] = numberArray[x] + "_" + commentArray[x] + ".jpg"
end
count.times do |x|
File.rename(oldArray[x], imageArray[x])
end
#uploadImage = cgi['upload']
#if uploadImage
# ucomments = cgi.params['uploadcomment']
# ucomments.each {|com| com.gsub!(" ", "_")}
# image = File.new("#{ucomments}.jpg", "w+")
# image << uploadImage
# image.close
#end
for thing in deleteArray
File.delete(thing)
end
print "<meta HTTP-EQUIV=\"REFRESH\" content=\"0; url=admin.rhtml\">"
uploading. The form is set to post to a ruby script on my server. The
script works(excluding file uploading) when I delete
ENCTYPE="multipart/form-data" from the form tag but if that is
present(and it needs to be for the image upload to work) then ruby cgi
chokes on a gsub for one of my text field parameters called comment.
imageadmin.rb:14: private method `gsub!' called for
#<StringIO:0x20221278> (NoMethodError)
Anyone have some ideas for how I can make this work?
Here is the form code (it is from an eruby file)
-----------------------------------------------------
% imageArray = Dir.glob("*.jpg").sort!
% commentArray = imageArray.collect {|image| image[4..-5]}
% commentArray.collect {|image| image.gsub!("_", " ")}
<FORM ENCTYPE="multipart/form-data" action="imageadmin.rb" method="post">
<%imageArray.length.times do |count|%>
<img src="<%=imageArray[count]%>">
<BR />
Comment:<input type="text" name="comment"
value="<%=commentArray[count]%>">
<BR />
Number:<input type="text" name="order"
value="<%=imageArray[count][0..2] %>">
<BR />
Delete:<input type="checkbox" name="delete"
value="<%=imageArray[count]%>">
<BR />
<%end%>
<BR />
<BR />
<input type="file" value="upload">
Comment:<input type="text" name="uploadcomment" value="">
<BR />
<input type="submit" value="Submit">
</FORM>
-----------------------------------------------------------------
And here is the script itself. I apologize for the lack of comments and
that it isn't as short as it could be. I am going to clean it up tonight.
-----------------------------------------------------------------------
#!/usr/bin/env ruby
$stderr = File.open("error.log", "w+")
print "Content-type: text/html\n\n"
require 'cgi'
cgi = CGI.new
deleteArray = cgi.params['delete']
imageArray = Dir.glob("*.jpg").sort!
oldArray = Dir.glob("*.jpg").sort!
commentArray = cgi.params['comment']
#####Here is where I get the error#####
commentArray.each {|com| com.gsub!(" ", "_")}
numberArray = cgi.params['order']
count = imageArray.length
count.times do |x|
imageArray[x].sub!(/^\d\d\d/, numberArray[x])
end
count.times do |x|
imageArray[x] = numberArray[x] + "_" + commentArray[x] + ".jpg"
end
count.times do |x|
File.rename(oldArray[x], imageArray[x])
end
#uploadImage = cgi['upload']
#if uploadImage
# ucomments = cgi.params['uploadcomment']
# ucomments.each {|com| com.gsub!(" ", "_")}
# image = File.new("#{ucomments}.jpg", "w+")
# image << uploadImage
# image.close
#end
for thing in deleteArray
File.delete(thing)
end
print "<meta HTTP-EQUIV=\"REFRESH\" content=\"0; url=admin.rhtml\">"